UE4材质节点的颜色分类

目标

UE4的材质节点有各种颜色:
在这里插入图片描述
这些颜色其实也是一种“信息”,它提示了节点本身的一种“类别”。

本篇的目标是:

  • 观察代码中决定材质节点颜色的逻辑
  • 总结出各个颜色所代表的类别

找到决定颜色的逻辑在哪

下面我们先观察代码中,决定材质节点颜色的逻辑在哪。


在UE4中,一个图表节点由一个UEdGraphNode表示,而它对应的界面控件由一个SGraphNode表示,这在之前的博客【UE4编辑器扩展】学习图表编辑器(UEdGraph):节点外观(SGraphNode) 中也有讨论。

对于材质节点来说:

  • 它的UEdGraphNode具体子类是UMaterialGraphNode
  • 它的界面控件还是SGraphNode,没有专门的子类。

对于SGraphNode来说,它的节点颜色(或者说标题的颜色)将由自身的SGraphNode::GetNodeTitleColor函数决定,在这其中的逻辑是询问它所对应的UEdGraphNode调用其UEdGraphNode::GetNodeTitleColor函数。
在这里插入图片描述

UEdGraphNode::GetNodeTitleColor是一个虚函数。那么答案就很明确了,材质节点的颜色,将由UMaterialGraphNode::GetNodeTitleColor函数决定。调试也印证了:
在这里插入图片描述

决定颜色的逻辑

UMaterialGraphNode::GetNodeTitleColor的内容如下:

整体来说,其中的逻辑就是不断地做为所有情况做分支判断。
在这里插入图片描述
而大多数返回的结果,并不是直接的颜色值,而是UGraphEditorSettings中预先设置好的值:
在这里插入图片描述

具体的分支判断

0. 当前预览节点

在这里插入图片描述
右键一个节点可选择开始预览它
在这里插入图片描述
如果节点在预览状态,则是深蓝色:

在这里插入图片描述

1. 布尔型

在这里插入图片描述
具体代码如下:
在这里插入图片描述
它针对于【静态的bool】与【bool参数】:
在这里插入图片描述

2. 浮点数型

在这里插入图片描述
具体代码如下:
在这里插入图片描述
它针对于【常数】与【标量参数】:
在这里插入图片描述

3. 向量型

在这里插入图片描述
具体代码如下:
在这里插入图片描述
它针对于【二/三/四 维的常量】以及【向量参数】:
在这里插入图片描述

4. 纹理类

在这里插入图片描述
具体代码如下:
在这里插入图片描述
针对于【纹理采样】和【字体采样】:
在这里插入图片描述

5. 输入类

在这里插入图片描述
具体代码如下:
在这里插入图片描述
大体上表示的意思是“它是节点逻辑的外部输入”,具体三种情况:

(1) “Shader输入型数据”,即材质表达式的bShaderInputData为真。
bShaderInputData为真的材质节点有很多,可以尝试在MaterialExpressions.cpp中进行搜索,可以找到出现54次:
在这里插入图片描述
这意味着大约(之所以说“大约”是因为用字符串搜索来判断是不准确的)有54种节点被视为“Shader输入型数据”。

这些“Shader输入型数据”包括【顶点数据】、【UniformBuffer中的数据】、【时间】等等:
在这里插入图片描述
(2) 材质函数中的输入

(节点标题以Input开头)
在这里插入图片描述
(3) 纹理坐标UV
在这里插入图片描述

6. 材质函数调用(UMaterialExpressionMaterialFunctionCall)

在这里插入图片描述
在这里插入图片描述

7. 材质图层(UMaterialExpressionMaterialAttributeLayers)

在这里插入图片描述
在这里插入图片描述
(关于“材质图层”的官方文档:材质图层 | Unreal Engine Documentation

8. 材质函数中的输入(UMaterialExpressionFunctionInput)

在这里插入图片描述
由于在 【5. 输入类】 中已经对此做了判断,所以此步的逻辑永远不会走到。

所以材质函数中输入的颜色会是红色而不是此处的蓝色。

9. 材质函数的输出(UMaterialExpressionFunctionOutput)

在这里插入图片描述
在这里插入图片描述

10. 材质图层的输出(UMaterialExpressionMaterialLayerOutput)

在这里插入图片描述
在这里插入图片描述

11. 自定义输出(UMaterialExpressionCustomOutput)

在这里插入图片描述
UMaterialExpressionCustomOutput的子类:
在这里插入图片描述
在这里插入图片描述

12. 参数类(当前针对UMaterialExpressionStaticComponentMaskParameter)

这个分支下,颜色是硬编码的:
在这里插入图片描述
对于UMaterial::IsParameter,它的内容如下:
在这里插入图片描述
首先它判断是否是UMaterialExpressionParameter,它有四个子类:
在这里插入图片描述
其中的三个其实已经在 【1. 布尔型】【2. 浮点数型】【3. 向量型】 中判断过了,只有UMaterialExpressionTextureSampleParameter是还没判断的。

而随后的判断:
由于UMaterialExpressionTextureSampleParameter其实继承自UMaterialExpressionTextureBaseUMaterialExpressionFontSampleParameter继承自UMaterialExpressionFontSample。而他们都在 【4. 纹理类】 中判断过了,所以这里的代码不会走到。

最终,只有UMaterialExpressionStaticComponentMaskParameter满足:
在这里插入图片描述
而随后的HasDuplicateParameters判断也有点意思,它判断这个节点是否有重复(指类型与参数名都重复),如果有,则会变为更亮的颜色:
在这里插入图片描述

13. 动态输入(UMaterialExpressionDynamicParameter)

与前者类似,颜色是硬编码的:
在这里插入图片描述
对于UMaterial::IsDynamicParameter,它判断是否是一个动态输入(UMaterialExpressionDynamicParameter
在这里插入图片描述
然而,由于UMaterialExpressionDynamicParameterbShaderInputData为真:
在这里插入图片描述
所以会早在 【5. 输入类】 中就得到判断,变成红色,而非这里的颜色。

因此这个分支永远也走不到

x. 其余所有类型(pure functions)

在这里插入图片描述
剩下的所有材质节点类型,都被视为“pure functions”:
在这里插入图片描述
它们有一系列很容易被观察的特点:

  • 它们与环境无关。给定一个固定的输入,就输出一个固定的结果。
  • 他们足够简单,基本上没法做更细粒度的分割。

代表的节点如 【加】【减】【乘】【除】【正弦】【余弦】【点乘】【叉乘】等等

在这里插入图片描述

总结

输入

在这里插入图片描述
如果将材质节点网络视为一段逻辑,那么这段逻辑的输入即为“输入节点”。
主要包括:

  • 材质函数的输入。
  • 从资源中获得的数据,如顶点数据等。
输出

在这里插入图片描述
如果将材质节点网络视为一段逻辑,那么这段逻辑的最终目的即为计算出一个结果,表示为“输出节点”。

  • 最主要的即为材质的输出,上面有“基础色”、“金属度”等的输出项。
  • 也包括材质函数的输出。
  • 还有各种其他输出,比如地形材质上的草输出GrassType。
数据类

材质网络中有多种数据,他们颜色各不相同:

布尔:
在这里插入图片描述
浮点数:
在这里插入图片描述
向量:
在这里插入图片描述
纹理:
在这里插入图片描述
每种数据都有固定的常量与可变的参数之分。但他们的颜色一样。

还有一种参数是“通道遮罩”(UMaterialExpressionStaticComponentMaskParameter)它的颜色是:
在这里插入图片描述

材质函数调用

在这里插入图片描述

其他(主要包括一些简单计算)

在这里插入图片描述

总结(图)

在这里插入图片描述

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UE4是一款强大的游戏引擎,其中的材质节点是用来创建和控制游戏中物体的表面外观的。在UE4中编写材质节点需要使用C++编程语言来创建自定义的节点。 首先,我们需要创建一个用于材质编程的MaterialInstanceDynamic对象。我们可以使用以下代码来创建它: UMaterialInstanceDynamic* DynamicMaterial = UMaterialInstanceDynamic::Create(OriginalMaterial, nullptr); 接下来,我们可以通过使用DynamicMaterial来设置和控制材质的参数。例如,我们可以使用以下代码来设置节点颜色参数: DynamicMaterial->SetVectorParameterValue(FName("Color"), FLinearColor(1.0f, 0.0f, 0.0f)); 除了设置基本的参数,我们还可以设置纹理和其他复杂的节点属性。例如,我们可以使用以下代码来设置一个纹理节点: DynamicMaterial->SetTextureParameterValue(FName("Texture"), Texture); 我们还可以使用C++代码来创建和连接各种节点的输入和输出。例如,我们可以使用以下代码来创建一个常量节点: UMaterialExpressionConstant* ConstantNode = NewObject<UMaterialExpressionConstant>(); ConstantNode->R = 0.5f; ConstantNode->G = 0.5f; ConstantNode->B = 0.5f; 然后,我们可以使用以下代码将该节点连接到材质的Diffuse输入节点上: DynamicMaterial->BaseColor.Expression = ConstantNode; 最后,我们需要将DynamicMaterial应用于我们想要渲染的物体上。我们可以使用以下代码来完成这一步骤: MeshComponent->SetMaterial(0, DynamicMaterial); 通过使用UE4中的C++编程语言,我们可以创建复杂的材质节点,从而实现更高级的渲染效果和外观。这使得我们能够在游戏中创造出令人印象深刻的图形效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值